// #include<iostream>
// #include<algorithm>
// #include<stack>
// #include<queue>
// #include<vector>
// using namespace std;
// const int maxn=1000;
// struct item{
//     double v,w;//v是重量,w是价值
//     int id;
//     bool operator<(const item a) const{
//         return w/v>a.w/a.v;
//     }
// }p[maxn];
// struct node{
//     double upw;
//     double vnow;
//     double wnow;
//     int lev;
//     bool chosed;
//     node *parent=nullptr;
//     node(double x,double y,double z,int a,bool b,node *c):upw(x),vnow(y),wnow(z),lev(a),chosed(b),parent(c){}
// };
// struct cmp
// {
//     bool operator() (node*a,node*b)
//     {
//         return a->upw<b->upw;
//     } 
// };
// int n,sumv,best;
// double bound(int now,int vnow,int wnow)
// {
//     while(now<=n&&vnow+p[now].v<=sumv)
//     {
//         vnow+=p[now].v;
//         wnow+=p[now].w;
//         now++;
//     }
//     if(now<=n) wnow+=(sumv-vnow)*p[now].w/p[now].v;
//     return wnow;
// }
// priority_queue<node*,vector<node*>,cmp> s;
// int main()
// {
//     node *topitem;
//     cin>>sumv>>n;
//     for(int i=1;i<=n;i++)
//     cin>>p[i].v>>p[i].w,p[i].id=i;
//     sort(p+1,p+1+n);
//     double up1=bound(1,0,0);
//     node *in=new node(up1,0,0,1,false,nullptr);
//     s.push(in);
//     while(!s.empty())
//     {
//         topitem=s.top();s.pop();
//         int i=topitem->lev;
//         if(i==n+1) break;
//         if(topitem->vnow+p[i].v<=sumv)
//         {
//             if(topitem->wnow+p[i].w>best)
//             best=topitem->wnow+p[i].w;
//             node *q=new node(topitem->upw,topitem->vnow+p[i].v,topitem->wnow+p[i].w,topitem->lev+1,topitem->chosed,topitem->parent);
//             q->parent=topitem,q->chosed=true;
//             s.push(q);
//         }
//         double up=bound(i+1,topitem->vnow,topitem->wnow);
//         if(up>=best)
//         {
//             node *q=new node(up,topitem->vnow,topitem->wnow,topitem->lev+1,topitem->chosed,topitem->parent);
//             q->chosed=false,q->parent=topitem;
//             s.push(q);
//         }
//     }
//     for(int j=n;j;j--)
//     {
//         if(topitem->chosed)
//         {
//             cout<<p[topitem->lev-1].id<<" ";
//         }
//         topitem=topitem->parent;
//     }
//     cout<<endl;
//     cout<<best;
// }
// 100 5
// 77 92
// 22 22
// 29 87
// 50 46
// 99 90




#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=1000;
struct item{
    double v,w;//v是体积,w是价值
    bool operator<(const item a) const{
        return w/v>a.w/a.v;
    }
}p[maxn];
struct node{
    double upw;
    double vnow;
    double wnow;
    int lev;
};
int n,sumv,best;
double bound(int now,int vnow,int wnow)
{
    while(now<=n&&vnow+p[now].v<=sumv)
    {
        vnow+=p[now].v;
        wnow+=p[now].w;
        now++;
    }
    if(now<=n) wnow+=(sumv-vnow)*p[now].w/p[now].v;
    return wnow;
}
stack<node> s;
int main()
{
    cin>>sumv>>n;
    for(int i=1;i<=n;i++)
    cin>>p[i].v>>p[i].w;
    sort(p+1,p+1+n);
    double up1=bound(1,0,0);
    s.push({up1,0,0,1});
    while(!s.empty())
    {
        node topitem=s.top();s.pop();
        int i=topitem.lev;
        if(i>n) continue;
        if(topitem.vnow+p[i].v<=sumv)
        {
            if(topitem.wnow+p[i].w>best)
            best=topitem.wnow+p[i].w;
            s.push({topitem.upw,topitem.vnow+p[i].v,topitem.wnow+p[i].w,i+1});
        }
        double up=bound(i+1,topitem.vnow,topitem.wnow);
        if(up>=best)
        {
            topitem.lev=i+1;
            s.push(topitem);
        }
    }
    cout<<best;
}